package com.thinvent.recommend.web.controller;

import com.thinvent.recommend.common.vo.ResponseResult;
import com.thinvent.recommend.manager.dto.DocVectorDTO;
import com.thinvent.recommend.service.ESQueryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;

/**
 * Elasticsearch 向量查询控制器（全部使用 GET）
 */
@RestController
@RequestMapping("/vectors")
public class ESQueryController extends BaseController{

    private static final Logger log = LoggerFactory.getLogger(ESQueryController.class);

    private final ESQueryService esQueryService;

    @Autowired
    public ESQueryController(ESQueryService esQueryService) {
        this.esQueryService = esQueryService;
    }

    /**
     * GET  /vectors/search?page=1&size=10
     * 分页查询所有向量文档
     */
    @GetMapping("/search")
    public ResponseResult searchAll(
            @RequestParam(name = "page", defaultValue = "1") int page,
            @RequestParam(name = "size", defaultValue = "10") int size) {
        try {
            List<DocVectorDTO> list = esQueryService.searchAll(page, size);
            return success(list);
        } catch (IOException e) {
            log.error("分页查询向量失败：1", e);
            return error("分页查询向量失败");
        }
    }

    /**
     * GET  /vectors/searchByDate
     * 按日期范围分页查询向量文档
     * @param startDate 起始日期，格式 "yyyy-MM-dd'T'HH:mm:ss"
     * @param endDate   结束日期，格式 "yyyy-MM-dd'T'HH:mm:ss"
     */
    @GetMapping("/searchByDate")
    public ResponseResult searchByDate(
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate")   String endDate,
            @RequestParam(name = "page", defaultValue = "1") int page,
            @RequestParam(name = "size", defaultValue = "10") int size) {
        try {
            List<DocVectorDTO> list = esQueryService.searchByDate(startDate, endDate, page, size);
            return success(list);
        } catch (IOException e) {
            log.error("按日期范围查询向量失败：", e);
            return error("按日期范围查询向量失败");
        }
    }

    /**
     * GET  /vectors/getById?docId=xxx
     * 根据文档 ID 查询单条向量数据
     * @param docId 文档业务 ID
     */
    @GetMapping("/getById")
    public ResponseResult getById(@RequestParam("docId") String docId) {
        try {
            DocVectorDTO dto = esQueryService.getById(docId);
            if (dto == null) {
                return error("查询向量数据失败");
            }
            return success(dto);
        } catch (IOException e) {
            log.error("按 ID 查询向量失败：", e);
            return error("按 ID 查询向量失败");
        }
    }

    /**
     * GET  /vectors/deleteByIds?ids=id1,id2,id3
     * 批量删除指定文档
     * @param ids 文档业务 ID 列表，逗号分隔
     */
    @GetMapping("/deleteByIds")
    public ResponseResult deleteByIds(@RequestParam("ids") List<String> ids) {
        try {
            esQueryService.deleteByIds(ids);
            return success();
        } catch (IOException e) {
            log.error("批量删除向量文档失败：", e);
            return error("批量删除向量文档失败");
        }
    }

    /**
     * GET  /vectors/clear
     * 删除索引中所有文档（match_all）
     */
    @GetMapping("/clear")
    public ResponseResult clearAll() {
        try {
            esQueryService.clearAll();
            return success();
        } catch (IOException e) {
            log.error("清空向量索引失败：", e);
            return error("清空向量索引失败");
        }
    }

    /**
     * GET /es/deleteIndex tips：会删除整个索引以及数据不可轻易调用。
     * 删除应用配置的那个索引（从配置项 elasticsearch.rest.indexName 读取），
     * 仅此一个，不会删除其他任何索引。
     *
     * @return 操作结果提示
     */
    @GetMapping("/deleteIndex")
    public ResponseResult deleteIndex() {
        try {
            esQueryService.deleteIndex();
            return success("索引已删除（仅限配置的 indexName）");
        } catch (IOException e) {
            log.error("删除索引失败：", e);
            return error("删除索引时出错");
        }
    }

    @GetMapping("/mapping")
    public ResponseResult getIndexMapping() {
        try {
            // 调用 Service 层方法
            String mappingJson = esQueryService.getIndexMapping();
            return success(mappingJson);
        } catch (IOException e) {
            log.error("获取索引 Mapping 失败：", e);
            return error("获取索引 Mapping 失败");
        }
    }

}
